﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel;
using System.Text;

namespace Anagramme.Contracts
{
    /// <summary>
    /// Callback pour le service de jeu
    /// </summary>
    public interface IGameServiceCallback
    {
        /// <summary>
        /// Réponse suite à une demande des informations sur l'équipe Bleue
        /// </summary>
        /// <param name="team">Informations sur l'équipe Bleue</param>
        [OperationContract(IsOneWay = true)]
        void ResponseGameBlueTeamInfos(Team team);

        /// <summary>
        /// Indique que le serveur à été arrêté
        /// </summary>
        [OperationContract(IsOneWay = true, IsTerminating = true)]
        void ResponseGameDisconnect();

        /// <summary>
        /// Indique que le jeu est terminé
        /// </summary>
        [OperationContract(IsOneWay = true)]
        void ResponseGameFinished();

        /// <summary>
        /// Indique que le score de l'équipe passée en paramètre à changer
        /// </summary>
        /// <param name="teamId">Identifiant de l'équipe dont le score à changer</param>
        /// <param name="score">Nouveau score de l'équipe</param>
        [OperationContract(IsOneWay = true)]
        void ResponseGameIncreaseTeamScore(int teamId, int score);

        /// <summary>
        /// Réponse suite à une demande des informations sur la partie
        /// </summary>
        /// <param name="infos">Informations sur la partie</param>
        [OperationContract(IsOneWay = true)]
        void ResponseGameInfos(GameInfo infos);

        /// <summary>
        /// Indique qu'un joueur à quitter la partie
        /// </summary>
        /// <param name="playerId">Identifiant du joueur ayant quitté la partie</param>
        [OperationContract(IsOneWay = true)]
        void ResponseGamePlayerLeave(int playerId);

        /// <summary>
        /// Indique qu'un nouveau round a commencé
        /// </summary>
        /// <param name="infos">Informations sur le round</param>
        [OperationContract(IsOneWay = true)]
        void ResponseGameNewRound(RoundInfo infos);

        /// <summary>
        /// Réponse suite à une demande des informations sur l'équipe Rouge
        /// </summary>
        /// <param name="team">Informations sur l'équipe Rouge</param>
        [OperationContract(IsOneWay = true)]
        void ResponseGameRedTeamInfos(Team team);

        /// <summary>
        /// Indique que le round est terminé
        /// </summary>
        [OperationContract(IsOneWay = true)]
        void ResponseGameRoundFinished();

        /// <summary>
        /// Indique qu'un mot à été trouvé par l'équipe adverse
        /// </summary>
        /// <param name="wordNumber">Index du mot trouvé</param>
        [OperationContract(IsOneWay = true)]
        void ResponseGameWordFound(int wordNumber);

        /// <summary>
        /// Réponse suite à une demande de contrôle d'un mot
        /// </summary>
        /// <param name="wordNumber">Index du mot contrôlé</param>
        /// <param name="result">Résultat du contrôle</param>
        /// <remarks>Le paramètre <paramref name="result"/> vaut True si le mot proposé est valide, sinon False</remarks>
        [OperationContract(IsOneWay = true)]
        void ResponseGameWordSubmit(int wordNumber, bool result);
    }
}
